﻿using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace SpaceInvaders001
{
    class Jogador
    {
        private Texture2D imagem;
        private Texture2D imagemTiro;
        private Vector2 posicao;
        private int vidas;
        public Rectangle rect;

        private bool invencivel = false;


        private int accumulatedMilliseconds;
        private int velocidadeDeResposta = 20;
        private int accumulatedMillisecondsTiro;
        private int accumulatedMillisecondsInvencibilidade;
        private int velocidadeDeRespostaTiro = 800;

        public Jogador(Texture2D imagem, Texture2D imagemTiro, Vector2 posicao, int vidas)
        {
            this.imagem = imagem;
            this.imagemTiro = imagemTiro;
            this.posicao = posicao;
            this.vidas = vidas;
            this.invencivel = true;
            this.rect = new Rectangle((int)this.posicao.X, (int)this.posicao.Y, this.imagem.Width, this.imagem.Height);
        }

        public void update(GameTime gameTime, KeyboardState keyState, ref List<Tiro> tiro, ref SoundEffectInstance sfxi)
        {


            if (this.invencivel && this.accumulatedMillisecondsInvencibilidade>3000)
            {
                this.invencivel = false;
            }
            else if (this.invencivel)
            {
                this.accumulatedMillisecondsInvencibilidade += gameTime.ElapsedGameTime.Milliseconds;
            }

            if (keyState.IsKeyDown(Keys.Left) || keyState.IsKeyDown(Keys.Right))
            {
                this.accumulatedMilliseconds += gameTime.ElapsedGameTime.Milliseconds;
                while (this.accumulatedMilliseconds > velocidadeDeResposta)
                {
                    this.accumulatedMilliseconds -= velocidadeDeResposta;
                    //Console.WriteLine(keyState.ToString());
                    if (keyState.IsKeyDown(Keys.Left)) { this.posicao.X -= 3; }
                    if (keyState.IsKeyDown(Keys.Right)) { this.posicao.X += 3; }
                    if (this.posicao.X < 0) { this.posicao.X = 0; }
                    if (this.posicao.X > 600 - this.imagem.Width) { this.posicao.X = 600 - this.imagem.Width; }

                    this.rect = new Rectangle((int)this.posicao.X, (int)this.posicao.Y, this.imagem.Width, this.imagem.Height);
                }
            }

            this.accumulatedMillisecondsTiro += gameTime.ElapsedGameTime.Milliseconds;
            if (keyState.IsKeyDown(Keys.Space))
            {
                while (this.accumulatedMillisecondsTiro > velocidadeDeRespostaTiro)
                {
                    this.accumulatedMillisecondsTiro = 0;
                    //Console.WriteLine(keyState.ToString());
                    if (keyState.IsKeyDown(Keys.Space))
                    {
                        Console.WriteLine("Tiro");
                        tiro.Add(new Tiro(this.imagemTiro, new Vector2(this.posicao.X + (this.imagem.Width / 2) - (this.imagemTiro.Width / 2), this.posicao.Y + 4)));
                        sfxi.Play();
                    }

                }
            }

            if (keyState.IsKeyDown(Keys.X))
            {
                tiro.Add(new Tiro(this.imagemTiro, new Vector2(this.posicao.X + (this.imagem.Width / 2) - (this.imagemTiro.Width / 2), this.posicao.Y + 4)));
            }

        }

        public void draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(this.imagem, this.posicao,
                                       new Rectangle(0, 0, this.imagem.Bounds.Width,
                                       this.imagem.Bounds.Height),
                                       Color.White, 0f, Vector2.Zero,
                                       1f,
                                       SpriteEffects.None,
                                       0.1f
                                       );
        }

        public bool EstaInvencivel
        {
            get
            {
                return this.invencivel;
            }
        }
        public int Vidas
        {
            get
            {
                return this.vidas;
            }
        }
        public bool semVidas
        {
            get
            {
                return (this.vidas <= 0);
            }
        }

        public void perdeVida()
        {
            this.vidas--;
        }
    }
}
